//
//  HMChooseView.swift
//  WeiBo
//
//  Created by apple on 16/6/30.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit

let HMChooseViewItemMargin: CGFloat = 5
let HMChooseViewItemWH: CGFloat = (kUIScreenWidth - 2 * HomeCellMargin - 2 * HMChooseViewItemMargin) / 3

let HMChooseViewReuseIdentifier = "HMChooseViewReuseIdentifier"

protocol HMChooseViewCollectionCellDelegate: NSObjectProtocol {
    // 先给他一个没有参数的
    func deleteImage(index: NSIndexPath)
    
}

class HMChooseView: UICollectionView {

    // 定义一个闭包
    var closure: (()->())?
    
    // 定义一个数组,用于保存图片
    private lazy var images: [UIImage] = [UIImage]()
    
    var flowLayout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    // 第一步 -- 重写构造函数
   override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        super.init(frame: frame, collectionViewLayout: flowLayout)
    
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 第二步 -- 定义一个方法,来实现 视图的添加和布局
    private func setupUI(){
        
        
        // 改变背景颜色
        backgroundColor = RandomColor()
        
        // 设置一下flowLayout 
        flowLayout.itemSize = CGSizeMake(HMChooseViewItemWH, HMChooseViewItemWH)
        flowLayout.minimumInteritemSpacing = HMChooseViewItemMargin
        flowLayout.minimumLineSpacing = HMChooseViewItemMargin
        
        // 设置数据源
        dataSource = self
        delegate = self
        
        
        // 注册cell
        registerClass(HMChooseViewCollectionCell.self, forCellWithReuseIdentifier: HMChooseViewReuseIdentifier)
        
    }
    
    //MARK:-- 对外创建一个方法,添加图片
    func addImage(image: UIImage){
        
        // 添加到数组里
        images.append(image)
        
        // 当我们的数据源更改的时候,一定要reloadData
        reloadData()
    }
    
    //MARK:-- 判断一下图片是否多余9张
    // 对外提供一个接口
    
    func isPresent() -> Bool {
        
      return images.count > 9 ? true: false
        
    }
    
    func getImages() -> [UIImage]{
        
        return images
        
    }
    
    // 第三步: 懒加载控件
}

extension HMChooseView: UICollectionViewDataSource,HMChooseViewCollectionCellDelegate,UICollectionViewDelegate{
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // 当没有图片的时候,没有加号按钮
        // 当有 1 - 8张图片 有加号按钮
        // 当有 9张图片的时候,没有加号按钮
        if images.count == 0 {
            return 0
        } else  if images.count == 9 {
            return 9
        } else {
            
            return images.count + 1
            
        }
        
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(HMChooseViewReuseIdentifier, forIndexPath: indexPath) as! HMChooseViewCollectionCell
        
        cell.backgroundColor = RandomColor()
        
        if indexPath.item == images.count {
            cell.image = UIImage(named: "compose_pic_add")
            cell.deleteButton.hidden = true
        } else {
            
            cell.image = images[indexPath.item]
            cell.deleteButton.hidden = false
            
        }
        
        // 设置代理
        cell.delegate = self
        // 把索引传递过去
        cell.index = indexPath
        
        return cell
    }
    
    
    func deleteImage(index: NSIndexPath) {
         // 删除图片的话,应该删除对应索引的图片
        images.removeAtIndex(index.item)
        
        // 数据源发生了改变,
        reloadData()
    }
    
    
    // collectionCell的选中代理方法
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        // 怎么才能知道是最后一个cell
        if indexPath.item == images.count {
            
            // 这里应该出现点击的选中图片视图
            closure?()
        }
        
    }
}

// Cell 与 索引 怎么发生关系

class HMChooseViewCollectionCell: UICollectionViewCell {
    
    // 声明一个代理属性
    weak var delegate: HMChooseViewCollectionCellDelegate?
    // 定义一个索引,用于传递索引
    var index: NSIndexPath?
    
    var image: UIImage? {
        
        didSet{
            
            iconImageView.image = image
            
        }
    }
    
    // 第一步 -- 重写构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 第二步 -- 定义一个方法,来实现 视图的添加和布局
    private func setupUI(){
        
        contentView.addSubview(iconImageView)
        contentView.addSubview(deleteButton)
        
        iconImageView.snp_makeConstraints { (make) -> Void in
            make.edges.equalTo(contentView.snp_edges)
        }
        
        deleteButton.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(contentView.snp_top)
            make.right.equalTo(contentView.snp_right)
            
        }
        
    }
    
    //MARK:-- 删除按钮的点击方法
    @objc private func deleteClick(button: UIButton){
        // 是这个把索引返回的
        // 对索引进行一个强制解包
        
        delegate?.deleteImage(index!)
        
    }
    
    // 第三步: 懒加载控件
    private lazy var iconImageView: UIImageView = UIImageView()
    
    // 删除按钮
    private lazy var deleteButton: UIButton = {
    
        let button = UIButton(type: UIButtonType.Custom)
        
        button.setImage(UIImage(named: "compose_photo_close"), forState: UIControlState.Normal)
        
        button.sizeToFit()
        
        // 添加事件点击
        button.addTarget(self, action: "deleteClick:", forControlEvents: UIControlEvents.TouchUpInside)
        
        return button
        
    }()
    
}
